NO.64 最小路径和 中等 

思路一:动态规划 我们要找最小路径和,一定是走数值较小的位置并且不往回走不绕路,又因为是从左上走到右下,所以每次都向右或者向下移动。
dp数组的含义:dp[i][j]走到[i][j]位置的最小路径和。
初始化:dp[0][0]=[0][0]
状态转移:dp[i][j]=Min(dp[i-1][j]+dp[i][j-1])+[i][j],因为每次只能向右或向下移动,所以[i][j]选择上方[i-1][j]或者左方[i][j-1]较小的路径走过来加上当前位置本身的值。要注意第一行没有上方、第一列没有左方。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | public int minPathSum(int[][] grid) {     int row = grid.length,col=grid[0].length;     int[][] dp=new int[row][col];     for (int i = 0; i < row; i++) {         for (int j = 0; j < col; j++) {                          if (i==0&&j!=0)dp[i][j]=dp[i][j-1]+grid[i][j];                          else if (j==0&&i!=0)dp[i][j]=dp[i-1][j]+grid[i][j];                          else if (j!=0&&i!=0)dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];                          else dp[i][j]=grid[i][j];         }     }     return dp[row-1][col-1]; }
  | 
 
时间复杂度:O(rowcol)    空间复杂度:O(row\col)
优化空间复杂度 直接在grid数组自身每个位置记录对应的最小路径和。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | public int minPathSum(int[][] grid) {     int row = grid.length,col=grid[0].length;     for (int i = 0; i < row; i++) {         for (int j = 0; j < col; j++) {                          if (i==0&&j!=0)grid[i][j]=grid[i][j-1]+grid[i][j];                          else if (j==0&&i!=0)grid[i][j]=grid[i-1][j]+grid[i][j];                          else if (j!=0&&i!=0)grid[i][j]=Math.min(grid[i-1][j],grid[i][j-1])+grid[i][j];                          else grid[i][j]=grid[i][j];         }     }     return grid[row-1][col-1]; }
  | 
 
时间复杂度:O(row*col)    空间复杂度:O(1)
本人菜鸟,有错误请告知,感激不尽!
更多题解和学习记录博客:博客、github